BAB 5PHP Lanjutan
Navigasi
session
$_POST
hash
login
cookie
PHP+
Backend Tingkat Lanjut

PHP Lanjutan

Selamat datang di Bab 5! Setelah menguasai dasar PHP, kini saatnya membangun aplikasi web dinamis & aman — mengingat pengguna, memproses form, mengunggah file, dan mengamankan password.

Orientasi

Tujuan Pembelajaran & Peta Materi

Di akhir bab ini, kamu mampu membangun sistem login PHP native yang aman dari nol.

🎯 Setelah bab ini kamu bisa…

  • Memecah kode dengan include & require (modular)
  • Mengelola state pengguna lewat session & cookie
  • Memproses form dengan GET, POST, dan validasi
  • Menangani upload file dengan aman
  • Mengamankan password & membuat sistem login

🗺️ Peta Materi

01
Modular
Include & Require
02
State
Session & Cookie
03
Form
GET/POST, validasi, upload
04
Keamanan
Hashing & Login
Modularitas

Include & Require

Daripada menulis menu & footer di setiap halaman, simpan sekali lalu sisipkan ke banyak file. Hover kartu untuk melihat bedanya.

index.php
<?php  include 'header.php';   // opsional  require 'koneksi.php';  // wajib?>  <h1>Konten Halaman Utama</h1><?php include 'footer.php'; ?>

🔵 include

File tidak ditemukan → muncul Warning, tapi program tetap lanjut.

Cocok untuk bagian opsional (menu, iklan).

hover / klik untuk balik ↻

🟠 require

File tidak ditemukan → muncul Fatal Error, program berhenti.

Cocok untuk file wajib (koneksi database).

hover / klik untuk balik ↻
Tips: Ada juga include_once & require_once agar file tidak tersisip dua kali.
Manajemen State

Session — Server yang Mengingat

HTTP itu "pelupa". Session membuat server mengingat siapa yang sedang login. Datanya disimpan di sisi server.

session.php
<?php  session_start();            // mulai sesi  $_SESSION['nama'] = 'Budi'; // simpan  echo $_SESSION['nama'];    // ambil  session_destroy();          // hapus saat logout?>

🧠 Cara Kerja Session

  • Server membuat ID sesi unik, dikirim ke browser via cookie
  • Data nyata (nama, role) tetap di server — lebih aman
  • session_start() wajib di baris paling atas, sebelum output apa pun
Sering lupa! Ada spasi/echo sebelum session_start() → muncul error "headers already sent".
Visual Logika

Flowchart: Siklus Hidup Session

Ikuti perjalanan sebuah sesi — dari request pertama sampai dihancurkan saat logout.

🧭 Membaca Alur

  • Kapsul = mulai / akhir sesi
  • Belah ketupat = keputusan (sesi ada? logout?)
  • Persegi = aksi PHP yang dijalankan
  • Selama belum logout, data sesi terus bisa dibaca di tiap halaman
Hubungkan: tiap persegi di sini = satu baris kode di slide sebelumnya.
Manajemen State

Cookie — Data di Sisi Browser

Berbeda dengan session, cookie disimpan di komputer pengguna dan punya masa kedaluwarsa. Perhatikan 4 fase siklusnya.

Create
setcookie()
Read
$_COOKIE[]
Expire
waktu habis
Delete
time()-3600
Jangan simpan password atau data sensitif di cookie — pengguna bisa membuka & mengubahnya.
cookie.php
<?php  // dibuat, berlaku 1 jam  setcookie('tema', 'gelap', time()+3600);  // dibaca  echo $_COOKIE['tema'];  // dihapus (expire ke masa lalu)  setcookie('tema', '', time()-3600);?>
Pengiriman Data

GET vs POST

Dua metode mengirim data form ke server. Pilih sesuai kebutuhan: tampil di URL atau tersembunyi di body.

AspekGETPOST
Lokasi dataDi URLDi body
Terlihat?Ya, tampakTidak tampak
KapasitasKecil (~2KB)Besar
KeamananRendahLebih aman
Cocok untukPencarian, filterLogin, simpan data
metode.php
<!-- GET: data tampil di URL -->  <form method="get">    <input name="cari">  </form>  // url?cari=php  →  $_GET['cari']<!-- POST: data tersembunyi -->  <form method="post">    <input name="password">  </form>  // $_POST['password']
Aturan praktis: data sensitif (password, login) selalu pakai POST. GET untuk hal yang boleh tampil di URL.
Memproses Input

Form Processing

Menerima data dari form, lalu mengolahnya di server. Pola intinya: cek metode → ambil data → bersihkan → tampilkan hasil.

proses.php
<?php  if ($_SERVER['REQUEST_METHOD'] == 'POST') {    $nama = trim($_POST['nama']);    if (empty($nama)) {      echo "Nama wajib diisi!";    } else {      echo "Halo, " . htmlspecialchars($nama);    }  }?>

🔄 Empat Tahap

  • Input — pengguna mengisi form
  • Validasi — periksa data benar & lengkap
  • Proses — simpan / olah data
  • Output — tampilkan hasil atau pesan error
htmlspecialchars() mengubah tag berbahaya jadi teks biasa — pertahanan dasar dari serangan XSS.
Visual Logika

Flowchart: Alur Form Processing

Jika data salah, alur "memantul" kembali ke pengguna untuk diperbaiki. Hanya data valid yang diproses.

🧭 Inti Alur

  • Server tidak langsung percaya input — selalu divalidasi dulu
  • Data salah → balik ke form (loop perbaikan)
  • Data benar → baru diproses & ditampilkan
Prinsip emas: "Never trust user input." Validasi adalah penjaga gerbang aplikasimu.
Menangani Berkas

Upload File

Menerima file dari browser membutuhkan enctype="multipart/form-data" dan superglobal $_FILES.

📁
Pilih File
input type="file"
🚀
Kirim
enctype multipart/form-data
🖥️
Server Terima
$_FILES['foto']
💾
Simpan
move_uploaded_file()
upload.php
<form method="post"      enctype="multipart/form-data">  <input type="file" name="foto">  <button>Upload</button></form><?php  $tmp  = $_FILES['foto']['tmp_name'];  $nama = $_FILES['foto']['name'];  move_uploaded_file($tmp, "uploads/".$nama);?>
Wajib dicek! Tipe file & ukuran sebelum disimpan, agar aman dari file berbahaya.
Keamanan Input

Validasi Form

Memastikan data bersih & benar sebelum diproses. Kumpulkan semua error dalam satu array agar pengguna tahu apa yang salah.

  • Tidak kosong → empty()
  • Email valid → filter_var(FILTER_VALIDATE_EMAIL)
  • Harus angka → is_numeric()
  • Bersihkan spasi → trim()
  • Cegah XSS → htmlspecialchars()
validasi.php
<?php  $err = [];  $nama  = trim($_POST['nama']);  $email = trim($_POST['email']);  $umur  = $_POST['umur'];  if (empty($nama)) $err[]="Nama wajib";  if (!filter_var($email, FILTER_VALIDATE_EMAIL))    $err[]="Email tidak valid";  if (!is_numeric($umur)) $err[]="Umur harus angka";  echo empty($err) ? "Data valid ✅" : implode(", ", $err);?>
Keamanan

Password Hashing

Password tidak pernah disimpan apa adanya. Ia diubah menjadi hash — kode acak satu arah yang tak bisa dikembalikan.

PLAINTEXT
rahasia123
🔒
HASH (disimpan)
$2y$10$N9qo8uLOickgx2ZMRZ...
hash.php
<?php  // saat registrasi → buat hash  $hash = password_hash('rahasia123', PASSWORD_DEFAULT);  // saat login → cocokkan  if (password_verify($input, $hash))    echo "Password benar ✅";  else    echo "Password salah ❌";?>

🔑 Dua Fungsi Kunci

  • password_hash() — buat hash saat daftar
  • password_verify() — cocokkan saat login
  • Satu arah: hash tidak bisa dikembalikan ke teks asli
Jangan pernah! Simpan password sebagai teks biasa atau pakai MD5. Selalu gunakan password_hash().
Autentikasi

Login Sederhana

Menggabungkan POST + validasi + password_verify + session menjadi sistem login utuh.

login.php
<?php  session_start();  $user = trim($_POST['username']);  $pass = $_POST['password'];  // ambil hash user dari database  if (password_verify($pass, $hashDb)) {    $_SESSION['login'] = $user;    header("Location: dashboard.php");  } else {    echo "Username / password salah";  }?>

🚪 Langkah Login

  • Ambil username & password dari $_POST
  • Cari user di database, ambil hash-nya
  • password_verify() cocokkan input vs hash
  • Cocok → simpan $_SESSION & redirect ke dashboard
  • Salah → tampilkan pesan error
header("Location: ...") memindahkan pengguna ke halaman lain setelah login berhasil.
Visual Logika

Flowchart: Alur Autentikasi Login

Inilah keputusan "berhasil atau gagal" — jantung dari setiap sistem login.

🔐 Dua Jalur Akhir

  • Ya → sesi dibuat, pengguna masuk dashboard
  • Tidak → pesan error, kembali ke form login
  • Dashboard selalu mengecek $_SESSION di awal — jika kosong, ditolak
Keamanan: jangan beri tahu mana yang salah (username atau password). Cukup "salah" agar tak mudah ditebak.
Studi Kasus

Arsitektur: Sistem Login PHP Native

Peta file yang akan kamu bangun. Setiap file punya satu tugas jelas — inilah modularitas yang dipelajari di awal bab.

📝 login.php

Form input + password_verify() + membuat session.

🔐 register.php

Daftar user baru + password_hash() sebelum simpan ke database.

🏠 dashboard.php

Cek $_SESSION. Jika kosong → tendang ke login.

🚪 logout.php

session_destroy() lalu redirect ke halaman login.

🔗 Penghubung: file koneksi.php dipanggil dengan require di setiap halaman yang butuh database.
Latihan Mandiri

Latihan 1 — Include & Session

Level: Menengah ⭐⭐ • 30 menit

🧩 Halaman dengan Header, Footer & Session

Latih modularitas file sekaligus manajemen sesi pengguna.

  1. Buat file header.php, footer.php, dan index.php.
  2. Gunakan include untuk memasukkan header & footer ke dalam index.
  3. Tambahkan session_start() dan simpan nama pengguna di $_SESSION.
  4. Tampilkan pesan "Selamat datang, [nama]" di halaman utama.
Target output: === HEADER ===   Selamat datang, Budi   === FOOTER ===

💡 Hint: Letakkan session_start() di baris paling atas, sebelum output HTML apa pun.

include
header
footer
session
$_SESSION
PHP
Latihan 01
Latihan Mandiri

Latihan 2 — Form Processing & Validasi

Level: Menantang ⭐⭐⭐ • 45 menit

📋 Form Pendaftaran dengan Validasi

Gabungkan POST + validasi untuk memproses input dengan aman.

  1. Buat form HTML dengan field: nama, email, umur.
  2. Proses form dengan PHP menggunakan $_POST.
  3. Validasi: nama tidak kosong, email valid (FILTER_VALIDATE_EMAIL), umur harus angka.
  4. Tampilkan pesan error atau sukses sesuai kondisi.
Checklist: nama kosong → error • email salah → error • semua benar → "Data berhasil disimpan ✅"

💡 Hint: Gunakan array $err = [] untuk menampung semua pesan kesalahan sekaligus.

$_POST
trim()
empty()
filter
is_num
Latihan 02
Tugas Akhir

Tugas Akhir Bab 5

Level: Proyek ⭐⭐⭐⭐ • Deadline 1 minggu

🚀 Mini Project: Sistem Login PHP Native

Bangun sistem login lengkap menggunakan PHP native. Terapkan SEMUA konsep Bab 5.

  1. Buat form login (HTML) & halaman register dengan password_hash().
  2. Lakukan validasi input di sisi PHP sebelum diproses.
  3. Verifikasi login dengan password_verify() & kelola session.
  4. Buat dashboard yang hanya bisa diakses jika sudah login.
  5. Tambah tombol logout yang menjalankan session_destroy().
Penilaian: Login/logout (30%), hashing aman (25%), validasi (20%), session (15%), kerapian modular (10%).
Bonus +10: fitur "Ingat Saya" pakai cookie. Kumpulkan file + screenshot hasil running.

🎉 Selamat! Kamu telah menyelesaikan Bab 5 — PHP Lanjutan. Aplikasi web dinamis & aman pertamamu siap dibangun!

login
hash
session
logout
$
🚀
Final Project